/*
1 通过话题发布速度控制消息，控制小乌龟画圆
2 定时发布速度控制消息，控制小乌龟画圆
3 通过定时器发布速度控制消息，控制小乌龟画圆
*/

# include "rclcpp/rclcpp.hpp"
# include "geometry_msgs/msg/twist.hpp"
# include <chrono>


class TurtleCircleNode : public rclcpp::Node{
        private:
            rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr pub_; // 定义一个发布者,这是一个只能指针
            rclcpp::TimerBase::SharedPtr timer_;
        public:
            explicit TurtleCircleNode(const std:: string node_name) : Node(node_name){    //  explict中存在隐式调用类的构造函数，所以需要显式调用，TurtleCircleNode name = "zhangs" 这就是隐调用 
                pub_ = this->create_publisher<geometry_msgs::msg::Twist>("/turtle1/cmd_vel", 10);   //话题名称不能随便写
                RCLCPP_INFO(this->get_logger(), "发布者创建成功");
                this->timer_ = this->create_wall_timer(std::chrono::milliseconds(500), [this](){
                    auto msg = geometry_msgs::msg::Twist();
                    RCLCPP_INFO(this->get_logger(),"位置:(%.2f,%.2f),thera = %.2f",msg.linear.x,msg.linear.y,msg.angular.z);
                    msg.linear.x = 2.0;
                    msg.linear.y = 0.0;
                    msg.angular.z = 1.0;
                    pub_->publish(msg);
                });  // 使用匿名函数，使用lambda表达式，使用[]
            }     
            // void timer_callback(){
            //     auto msg = geometry_msgs::msg::Twist();
            //     msg.linear.x = 2.0;
            //     msg.angular.z = 1.0;
            //     pub_->publish(msg);   //发布消息

            // }      

};
    

int main(int argc, char **argv){
    rclcpp::init(argc, argv);
    auto node = std::make_shared<TurtleCircleNode>("turtle_circle_node");
    rclcpp::spin(node);
    rclcpp::shutdown();

    return 0;
}

